package untiring07.mvc.controller;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(
		name = "MVCControllerSetup",
		initParams = {@WebInitParam(name="mvcCfg", value="/WEB-INF/mvc.properties")}
)
public class MVCControllerSetup extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	// 요청 처리에 사용하는 action 클래스들을 키와 이름 형태로 Map 자료 구조에 저장
	private static Map<String,Object> actionsMap = new HashMap<>();
	
	// action 클래스들이 저장된 Map을 반환함
	public static Map<String,Object> getActionsMap(){
		return actionsMap;
	}
	
	// 요청URI와 그것과 관련있는 action클래스를 연결시켜  Map에 저장해 둠
	public void init(ServletConfig cfg) throws ServletException{
		System.out.println("MVCControllerSetup 클래스를 시작합니다.");
		
		// 요청URI와 이것과 관련있는 action 클래스들을 외부파일에 저장해 두었는데,
		// MVC 초기 작업을 위해 이것을 메모리로 불러와야 함 서블릿 초기화 매개 변수를 이용해서 
		// 외부 설정 파일을 불러옴
		String mvcCfg = cfg.getInitParameter("mvcCfg");
		System.out.println("경로:"+ mvcCfg);
		
		// 읽어 들인 파일은 키 = 값 형태로 메모리 상에 저장해두기 위해 Properties 클래스를 선언함
		Properties p = new Properties();
		
		// 파일에 저장된 내용을 읽기 위해 FileInputStream 클래스를 선언함
		FileInputStream fis = null;
		
		try{
			// 지정된 경로에 있는 설정파일의 내용을
			String cfgPath = cfg.getServletContext().getRealPath(mvcCfg);
			System.out.println("실제경로:"+ cfgPath);
			// 메모리로 읽어들여
			fis = new FileInputStream(cfgPath);
			// 키 = 값 형태로 메모리상에 따로 저장해 둠
			p.load(fis);
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			if(fis != null)	try{fis.close();}catch (Exception e) {}
		}
		
		//메모리에 저장된 키 = 값 객체들을 조회하기 쉽도록 Iterator클래스로 재구성함
		Iterator<Object> iter = p.keySet().iterator();
		// Iterator 객체에 저장된 정보들을 
		while(iter.hasNext()){
			//순차적으로 하나씩 꺼낸 후
			String cmd = (String)iter.next();
			// Properties 중 '값'을 이용해서
			String actionClassName = p.getProperty(cmd);
			
			try{
				// action 클래스에 대한 객체를  동적으로 생성하고
				Class<?> actionClass =	Class.forName(actionClassName);
				Object actionInstance = actionClass.newInstance();
				// 이 객체에 대한 이름을 Properties 중 '키'로 지정
				actionsMap.put(cmd, actionInstance);
			}catch(Exception ex){
			ex.printStackTrace();
			}//try
		}//while
		
		System.out.println("MVCControllerSetup 클래스를 종료합니다.");
	}

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

}
